﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace OttoEngineSimulation
{
    public partial class Zylinder : UserControl
    {
        Brush farbeKolbenStange = new SolidBrush(Color.Gray);
        Brush farbeKurbelWelle = new SolidBrush(Color.Black);
        Pen farbeSeite = new Pen(Color.Black);
        private int maxVerschiebung;
        private int minVerschiebung;

        Rectangle zylinderHuelle;
        private int zylinderBreite = 140;
        private int zylinderHoehe = 200;
        Point zylinderPosition;
        Point zylinderUntenRechtspkt;
        Pen zylinderFarbe = new Pen(Color.Black);

        List<int> temp = new List<int>();
        private int kolbenBreite = 140;
        private int kolbenHoehe = 40;
        Point kolbenPosition;
        Point kolbenUntenRechts;
        Rectangle kolben;


        public int hoheee;
        private int stangenBreite = 20;
        private int stangenLaenge = 150;
        Point stangePosition;
        Point stangenGroesenPunkt;
        Rectangle stange;


        Rectangle kurbelWelle;
        private int kurbelBreite = 100;
        private int kurbelHoehe = 10;
        Point kurbelUntenRechts;
        Point kurbelPosition;

        private Rectangle Kurbellinks;
        private int seitenBreite = 10;
        private int seitenHoehe;
        private Rectangle KurbelRechts;

        private Rectangle rechtsVerbindung;
        private Rectangle linksVerbindung;
        private int verbindungshoehe = 20;
        private int verbindungsbreite = 20;


        public Zylinder(int startHoehe, int maxVerschiebung, int minVerschiebung)
        {
            InitializeComponent();
            this.hoheee = startHoehe;
            this.maxVerschiebung = maxVerschiebung;
            this.minVerschiebung = minVerschiebung;
            this.seitenHoehe = maxVerschiebung - minVerschiebung + this.kurbelHoehe - 1;
            this.BerechneGroesse();
            // this.ErstellKomponenten();
            this.ErstAusrichtung();


        }
        private void ErstAusrichtung()
        {
            this.BerechneErstausrichtungZylinderHuelle();
            this.BerechneErstausrichtungStange();
            this.BerechneErstausrichtungKolben();
            this.BerechneErstausrichtungKurbelWelle();
            this.BerechneErstausrichtungSeiten();
            this.BerechneErstausrichtungVerbindungen();
        }


        private void BerechneStangenPosition(int hoehe)
        {
            this.stangePosition = new Point(this.stangePosition.X, hoehe);
            this.stange.Location = this.stangePosition;
        }

        private void BerechneKolbenPosition()
        {
            this.kolbenPosition = new Point(this.kolbenPosition.X, this.stangePosition.Y - this.kolbenHoehe);
            this.kolben.Location = this.kolbenPosition;
        }

        private void BerechneKurbelPosition()
        {
            this.kurbelPosition = new Point(this.kurbelPosition.X, this.stange.Bottom);
            this.kurbelWelle.Location = this.kurbelPosition;
        }

        private void ZeichneZylinder(Graphics g)
        {
            g.DrawRectangle(this.zylinderFarbe, this.zylinderHuelle);
        }

        private void BerechneGroesse()
        {

            this.kolbenUntenRechts = new Point(this.kolbenBreite, this.kolbenHoehe);
            this.stangenGroesenPunkt = new Point(this.stangenBreite, this.stangenLaenge);
            this.kurbelUntenRechts = new Point(this.kurbelBreite, this.kurbelHoehe);
            this.zylinderUntenRechtspkt = new Point(this.zylinderBreite, this.zylinderHoehe);

        }

        public void ZeichneKolbenkopf(Graphics g)
        {

            g.FillRectangle(new SolidBrush(Color.Red), this.kolben);

        }

        private void ZeichneStange(Graphics g)
        {

            g.DrawRectangle(new Pen(Color.Red), this.stange);

        }

        public void BerechneBewegung(int x, int y, Graphics g)
        {

            double erg = (this.stangenLaenge * this.stangenLaenge) - (y * y);
            double erg2 = Math.Sqrt(erg);
            int erg3 = (int)erg2 + x;


        }

        private void VerschiebeKolben3(int hoehe, Graphics g)
        {
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
            g.Clear(this.BackColor);
            this.BerechneStangenPosition(hoehe);
            this.BerechneKolbenPosition();
            this.BerechneKurbelPosition();
            g.FillRectangles(this.farbeKolbenStange, new Rectangle[] { this.kolben, this.stange });
            g.FillRectangle(this.farbeKurbelWelle, this.kurbelWelle);
            g.DrawRectangles(this.farbeSeite, new Rectangle[] { this.KurbelRechts, this.Kurbellinks, this.linksVerbindung, this.rechtsVerbindung });


        }

        private void Kolben_Paint(object sender, PaintEventArgs e)
        {
            this.VerschiebeKolben3(this.hoheee, e.Graphics);
            this.ZeichneZylinder(e.Graphics);
        }

        private void BerechneErstausrichtungZylinderHuelle()
        {
            int zylinderHuellePositionX = this.Location.X + 10;
            int zylinderHuellePositionY = this.Location.Y + 20;
            this.zylinderPosition = new Point(zylinderHuellePositionX, zylinderHuellePositionY);
            this.zylinderHuelle = new Rectangle(this.zylinderPosition, new Size(this.zylinderUntenRechtspkt));
        }

        private void BerechneErstausrichtungStange()
        {
            int mitteZylinder = this.zylinderHuelle.Width / 2;
            int stangenHaelfte = this.stangenBreite / 2;

            int stangenPositionX = (mitteZylinder - stangenHaelfte) + this.zylinderHuelle.X;
            int stangenPositionY = this.hoheee;
            this.stangePosition = new Point(stangenPositionX, stangenPositionY);
            this.stange = new Rectangle(this.stangePosition, new Size(this.stangenGroesenPunkt));
        }

        private void BerechneErstausrichtungKolben()
        {
            int kolbenPositionX = this.stangePosition.X - (this.kolbenBreite / 2 - this.stangenBreite / 2);
            int kolbenPositionY = this.stange.Location.Y - this.kolbenHoehe;
            this.kolbenPosition = new Point(kolbenPositionX, kolbenPositionY);
            this.kolben.Location = this.kolbenPosition;
            this.kolben.Size = new Size(this.kolbenUntenRechts);
        }

        private void BerechneErstausrichtungKurbelWelle()
        {
            int kurbelPositionX = this.stange.Left - (this.kurbelBreite / 2 - this.stangenBreite / 2);
            int kurbelPositionY = this.stange.Bottom;
            this.kurbelPosition = new Point(kurbelPositionX, kurbelPositionY);
            this.kurbelWelle = new Rectangle(this.kurbelPosition, new Size(this.kurbelUntenRechts));
        }

        private void BerechneErstausrichtungSeiten()
        {
            int seitenHoehe = this.stangenLaenge + this.minVerschiebung;
            int linkeSeiteX = this.kurbelPosition.X - this.seitenBreite;
            int rechteSeiteX = this.kurbelWelle.Right;
            this.Kurbellinks = new Rectangle(new Point(linkeSeiteX, seitenHoehe), new Size(this.seitenBreite, this.seitenHoehe));
            this.KurbelRechts = new Rectangle(new Point(rechteSeiteX, seitenHoehe), new Size(this.seitenBreite, this.seitenHoehe));
        }

        private void BerechneErstausrichtungVerbindungen()
        {
            int verbindungshoehe = this.seitenHoehe / 2 - this.verbindungshoehe / 2 + this.Kurbellinks.Y;
            int rechteVerbindungX = this.KurbelRechts.Right;
            int linkeVerbindungX = this.Kurbellinks.X - this.verbindungsbreite;
            this.linksVerbindung = new Rectangle(linkeVerbindungX, verbindungshoehe, this.verbindungsbreite, this.verbindungshoehe);
            this.rechtsVerbindung = new Rectangle(rechteVerbindungX, verbindungshoehe, this.verbindungsbreite, this.verbindungshoehe);
        }


    }
}
